package Static_Final;/*
 *
 * @author 陈粒
 * @version 创建时间：2021/7/8 16:11
 */

/**
 * static笔试题2
 * 执行过程：
 * 找到main方法入口，main方法是程序入口，但在执行main方法之前，要先加载Static_Test2类
 *
 * 加载Static_Test2类的时候，发现Static_Test2类有static块，而是先执行static块，输出Static_Test2 static结果
 *
 * 然后执行new MyClass(),执行此代码之前，先加载MyClass类，发现MyClass类继承Static_Test2类，而是要先加载Static_Test2类，Static_Test2类之前已加载
 *
 * 加载MyClass类，发现MyClass类有static块，而是先执行static块，输出myclass static结果
 *
 * 然后调用MyClass类的构造器生成对象，在生成对象前，需要先初始化父类Static_Test2的成员变量，而是执行Person person = new Person("Static_Test2")代码，发现Person类没有加载
 *
 * 加载Person类，发现Person类有static块，而是先执行static块，输出person static结果
 *
 * 接着执行Person构造器，输出person Static_Test2结果
 *
 * 然后调用父类Static_Test2构造器，输出Static_Test2 constructor结果，这样就完成了父类Static_Test2的初始化了
 *
 * 再初始化MyClass类成员变量，执行Person构造器，输出person MyClass结果
 *
 * 最后调用MyClass类构造器，输出myclass constructor结果，这样就完成了MyClass类的初始化了
 */
public class Static_Test2 {
    Person person = new Person("Static_Test2");//父类成员变量
    static{
        System.out.println("Static_Test2 static");//父类静态代码块
    }

    public Static_Test2() {
        System.out.println("Static_Test2 constructor");//父类构造函数
    }

    public static void main(String[] args) {
        new MyClass();//创建子类MyClass对象，调用子类无参构造函数
    }
}

class Person{
    static{
        System.out.println("person static");//静态代码块
    }
    public Person(String str) {
        System.out.println("person "+str);//构造函数
    }
}


class MyClass extends Static_Test2 {
    Person person = new Person("MyClass");//子类成员变量
    static{
        System.out.println("myclass static");//子类静态代码块
    }

    public MyClass() {
        //隐式super();
        System.out.println("myclass constructor");//子类构造函数
    }
}